package com.wanghua.spring.util.convertor;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;

import ognl.DefaultTypeConverter;

/*
* 日期转换器。
* 该转换器能够转换各种常用时间格式，也能将 Date 转成 String。
* 转换器类除了配置到 xwork-conversion.properties（一个 Struts2 的配置文件）文件中，还可以配置到 struts.xml 的 Action 中，这时候，转换器将作用于当前的 Action。
*
*  Struts2 默认的转换器并不总是满足要求。例如，输入时间，Struts2 只能转换形如 12:00:00 的格式，而输入 12:00 就会抛错。也有一些数据类型 Struts2 转换不了。
* 因此需要自定义数据转换器。
* */
public class DateTimeConvertor extends DefaultTypeConverter {  //DefaultTypeConverter 是位于 ognl 包下的，可看出Struts2集成了许多其他技术
	private DateFormat[] dateFormat = {
			new SimpleDateFormat("yyyy-MM-dd"),
			new SimpleDateFormat("yyyy/MM/dd"),
			new SimpleDateFormat("yy-MM-dd"),
			new SimpleDateFormat("yy/MM/dd")
	};

	private DateFormat[] timeFormat = {
			new SimpleDateFormat("HH:mm:ssss"),
			new SimpleDateFormat("HH:mm")
	};

	@Override
	public Object convertValue(Map context, Object value, Class toType) { // 参数 toType 是 Action 中对应的属性的类型。
		if (toType.equals(java.sql.Date.class)) {
			String[] parameterValues = (String[]) value;  //注意：提交数据时，参数 value 为 request.GetParameterValues(string name) 返回的是 String[]。
			for (DateFormat format : dateFormat)
				try {
					java.util.Date v = format.parse(parameterValues[0]);
					return new java.sql.Date(v.getTime());  //getTime() 返回的是时间的毫秒数
				} catch (ParseException e) {
				}
		} else if (toType.equals(java.sql.Time.class)) {
			String[] parameterValues = (String[]) value;
			for (DateFormat format : timeFormat)
				try {
					return new java.sql.Time(format.parse(parameterValues[0]).getTime());
				} catch (ParseException e) {
				}
		} else if (toType.equals(java.util.Date.class)) {
			String[] parameterValues = (String[]) value;
			for (DateFormat format : dateFormat)
				try {
					return format.parse(parameterValues[0]);
				} catch (ParseException e) {
				}
		} else if (toType.equals(String.class)) {
			if (value instanceof java.util.Date) {   //java.sql.Date、java.sql.Time 都 extend java.util.Date
				return dateFormat[0].format((java.util.Date) value);
			}
		}

		return super.convertValue(context, value, toType);
	}
}
